﻿#include <iostream>
#include <string>
#include <array>
using namespace std;

int main()
{

	char c;

	// p的位置
	int px = 3;
	int py = 1;

	// 内容区域
	int c_width = 10;
	int c_height = 4;

	// 开始和结尾显示的字符
	string being_end_output(c_width + 2, '#');

	// 内容区域显示的文本
	string content;

	// 终点位置
	array<int, 6> targets{ 1, 0, 2, 0, 5, 3 };

	// 箱子位置
	array<int, 6> boxes{ 1, 1, 2, 1, 8, 3 };

	// P要移动的方向
	int mx = 0;
	int my = 0;

	// 游戏是否结束
	bool game_over = false;

	while (!game_over) {
		cout << "--new---" << endl;
		// 内容展示逻辑
		content = "";

		cout << being_end_output << endl;
		for (int h = 0; h < c_height; h++) {
			content += '#';
			for (int w = 0; w < c_width; w++) {
				// 是否是P
				bool isP = h == py && w == px;
				// 是否是终点
				bool isTarget = false;
				// 是否是箱子
				bool isBox = false;
				// 如果是P，则该位置显示p
				if (isP) {
					content += 'p';
					continue;
				}
				// 非P，判断是否为箱子位置
				for (int index = 0; index < boxes.size(); index += 2) {
					if (boxes[index] == w && boxes[index + 1] == h) {
						isBox = true;
						break;
					}
				}
				// 非P也非箱子，判断是否为终点
				for (int index = 0; index < targets.size(); index += 2) {
					if (targets[index] == w && targets[index + 1] == h) {
						isTarget = true;
						break;
					}
				}
				if (isBox && isTarget) {
					content += 'O';
					continue;
				}
				else if (isBox) {
					content += 'o';
					continue;
				}
				else if (isTarget) {
					content += '.';
					continue;
				}
				// 都不是，显示空格
				content += ' ';
			}
			content += '#';
			content += '\n';
		}
		cout << content;
		cout << being_end_output << endl;

		bool over = true;
		// 游戏终止条件判断
		for (char c : content) {
			if (c == '.') {
				// 游戏未结束
				over = false;
				break;
			}
		}
		game_over = over;

		if (game_over) {
			break;
		}

		cin >> c;

		mx = 0;
		my = 0;

		// 根据输入处理游戏逻辑
		switch (c) {
		case 'a':
			mx = -1;
			break;
		case 'd':
			mx = 1;
			break;
		case 's':
			my = 1;
			break;
		case 'w':
			my = -1;
			break;
		default:
			break;
		}

		// 碰到了第几个箱子，如果没碰到则为-1
		int touched_box = -1;

		// 判断是否碰到了箱子
		for (int index = 0; index < boxes.size(); index += 2) {
			if (boxes[index] == px + mx && boxes[index + 1] == py + my) {
				touched_box = index;
				break;
			}
		}
		// 判断是否可以移动
		bool is_move_able = true;
		// 没碰到箱子的情况，则判断p是否撞墙即可
		if (touched_box == -1) {
			is_move_able = px + mx != -1 && px + mx != c_width && py + my != -1 && py + my != c_height;
		}
		// 碰到箱子的情况，要判断箱子是否可以移动
		else {
			// 判断箱子是否撞墙
			int moved_box_x = boxes[touched_box] + mx;
			int moved_box_y = boxes[touched_box + 1] + my;
			is_move_able = moved_box_x >= 0 && moved_box_y >= 0 && moved_box_x < c_width && moved_box_y < c_height;

			// 判断该位置是否有其他箱子
			for (int index = 0; index < boxes.size(); index += 2) {
				if (boxes[index] == moved_box_x && boxes[index + 1] == moved_box_y) {
					is_move_able = false;
					break;
				}
			}
		}
		if (is_move_able) {
			px += mx;
			py += my;
			if (touched_box != -1) {
				boxes[touched_box] += mx;
				boxes[touched_box + 1] += my;
			}
		}
	}

	cout << "恭喜你完成了游戏" << endl;

	cin.get();
	cin.get();
}
